import axios from 'axios'
import router from '@/router'
// import { MessageBox, Message } from 'element-ui'
// import store from '@/store'
import { getToken, removeToken } from '@/utils/auth'

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

const CancelToken = axios.CancelToken
const pending = [] // 声明一个数组用于存储每个请求的取消函数和axios标识
const removePending = (config) => {
  for (const i in pending) {
    if (pending[i].url === config.baseURL + config.url) {
      // 在当前请求在数组中存在时执行取消函数
      pending[i].f() // 执行取消操作
      pending.splice(i, 1) // 根据具体情况决定是否在这里就把pending去掉
      // console.log(i, pending[i])
    }
  }
}

// 请求前拦截
service.interceptors.request.use(config => {
  if (getToken()) {
    config.headers.common['X-Token'] = getToken()
  }
  removePending(config) // 在一个axios发送前执行一下判定操作，在removePending中执行取消操作
  // console.log(config.url)
  config.cancelToken = new CancelToken(function executor(c) { // 本次axios请求的配置添加cancelToken
    pending.push({
      // url: config.url,
      url: config.baseURL + config.url,
      f: c
    })
    // 将本次的url添加到pending中，因此对于某个url第一次发起的请求不会被取消，因为还没有配置取消函数
  })
  return Promise.resolve(config)
  // return config
}, error => {
  return Promise.reject(error)
})

// 响应后拦截
service.interceptors.response.use(response => {
  // removePending(response.config) // 在一个axios响应后再执行一下取消操作，把已经完成的请求从pending中移除
  // console.log(response.config) // 如果返回undefined说明被拦截了
  return Promise.resolve(response.data)
}, err => {
  // 加载失败
  if (err.toString().indexOf('timeout') !== -1) {
    console.log('请求超时，请稍后再试')
  }
  if (err && err.response) {
    switch (err.response.status) {
      case 400:
        err.message = '请求错误'
        break
      case 401:
        err.message = '未授权，请登录'
        removeToken()
        router.push({ path: '/login' })
        break
      case 403:
        err.message = '拒绝访问'
        break
      case 404:
        err.message = `请求地址出错: ${err.response.config.url}`
        break
      case 405:
        err.message = `请求地址出错:`
        break
      case 408:
        err.message = '请求超时'
        break
      case 500:
        err.message = '网络错误，请稍后再试'
        break
      case 501:
        err.message = '网络错误，请稍后再试'
        break
      case 502:
        err.message = '网络错误，请稍后再试'
        break
      case 503:
        err.message = '网络错误，请稍后再试'
        break
      case 504:
        err.message = '网络错误，请稍后再试'
        break
      case 505:
        err.message = 'HTTP版本不受支持'
        break
      default:
    }
    if (err.response.data.msg) {
      err.message = err.response.data.msg
    }

    console.error(err.message)
  }
  return Promise.reject(err)
})

export default service
